home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / pyshared / checkbox / lib / iterator.py < prev    next >
Encoding:
Python Source  |  2009-04-27  |  6.3 KB  |  218 lines

  1. #
  2. # This file is part of Checkbox.
  3. #
  4. # Copyright 2008 Canonical Ltd.
  5. #
  6. # Checkbox is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # Checkbox is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with Checkbox.  If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. import types
  20.  
  21.  
  22. PREV = -1
  23. NEXT = 1
  24.  
  25.  
  26. class Iterator(object):
  27.  
  28.     def __init__(self, elements=[]):
  29.         self.elements = elements
  30.         self.index = -1
  31.  
  32.     def __iter__(self):
  33.         self.index = -1
  34.         return self
  35.  
  36.     def has_next(self, *args, **kwargs):
  37.         return self.index < len(self.elements) - 1
  38.  
  39.     def next(self, *args, **kwargs):
  40.         if not self.has_next(*args, **kwargs):
  41.             self.index = len(self.elements)
  42.             raise StopIteration
  43.  
  44.         self.index += 1
  45.         return self.elements[self.index]
  46.  
  47.     def _force_next(self):
  48.         """Iterate one beyond the last element."""
  49.         if self.index < len(self.elements):
  50.             self.index += 1
  51.  
  52.     def has_prev(self, *args, **kwargs):
  53.         return self.index > 0
  54.  
  55.     def prev(self, *args, **kwargs):
  56.         if not self.has_prev(*args, **kwargs):
  57.             raise StopIteration
  58.  
  59.         self.index -= 1
  60.         return self.elements[self.index]
  61.  
  62.     def _force_prev(self):
  63.         """Iterate one beyond the first element."""
  64.         if self.index > -1:
  65.             self.index -= 1
  66.  
  67.     def last(self, *args, **kwargs):
  68.         while True:
  69.             try:
  70.                 self.next(*args, **kwargs)
  71.             except StopIteration:
  72.                 break
  73.  
  74.         return self
  75.  
  76.     def go(self, direction, *args, **kwargs):
  77.         if direction == NEXT:
  78.             element = self.next(*args, **kwargs)
  79.         elif direction == PREV:
  80.             element = self.prev(*args, **kwargs)
  81.         else:
  82.             raise Exception, "Unknown direction: %s" % direction
  83.  
  84.         return element
  85.  
  86.  
  87. class IteratorContain(Iterator):
  88.  
  89.     def __init__(self, elements=[]):
  90.         if type(elements) is types.ListType:
  91.             self.iterator = Iterator(elements)
  92.         elif isinstance(elements, Iterator):
  93.             self.iterator = elements
  94.         else:
  95.             raise Exception, "%s: invalid iterator type" % type(elements)
  96.  
  97.     def __iter__(self):
  98.         self.iterator = iter(self.iterator)
  99.         return self
  100.  
  101.     def has_next(self, *args, **kwargs):
  102.         return self.iterator.has_next(*args, **kwargs)
  103.  
  104.     def next(self, *args, **kwargs):
  105.         return self.iterator.next(*args, **kwargs)
  106.  
  107.     def _force_next(self):
  108.         self.iterator._force_next()
  109.  
  110.     def has_prev(self, *args, **kwargs):
  111.         return self.iterator.has_prev(*args, **kwargs)
  112.  
  113.     def prev(self, *args, **kwargs):
  114.         return self.iterator.prev(*args, **kwargs)
  115.  
  116.     def _force_prev(self):
  117.         self.iterator._force_prev()
  118.  
  119.  
  120. class IteratorExclude(IteratorContain):
  121.  
  122.     def __init__(self, elements=[], next_func=None, prev_func=None):
  123.         super(IteratorExclude, self).__init__(elements)
  124.         self.next_func = next_func
  125.         self.prev_func = prev_func
  126.  
  127.     def has_next(self, *args, **kwargs):
  128.         if self.iterator.has_next(*args, **kwargs):
  129.             element = self.iterator.next(*args, **kwargs)
  130.             if self.next_func is not None \
  131.                and self.next_func(element, *args, **kwargs):
  132.                 return self.has_next(*args, **kwargs)
  133.             else:
  134.                 self.iterator._force_prev()
  135.                 return True
  136.  
  137.         return False
  138.  
  139.     def next(self, *args, **kwargs):
  140.         if not self.has_next(*args, **kwargs):
  141.             self.iterator._force_next()
  142.             raise StopIteration
  143.  
  144.         element = self.iterator.next(*args, **kwargs)
  145.         return element
  146.  
  147.     def has_prev(self, *args, **kwargs):
  148.         if self.iterator.has_prev(*args, **kwargs):
  149.             element = self.iterator.prev(*args, **kwargs)
  150.             if self.prev_func is not None \
  151.                and self.prev_func(element, *args, **kwargs):
  152.                 return self.has_prev(*args, **kwargs)
  153.             else:
  154.                 self.iterator._force_next()
  155.                 return True
  156.  
  157.         return False
  158.  
  159.     def prev(self, *args, **kwargs):
  160.         if not self.has_prev(*args, **kwargs):
  161.             raise StopIteration
  162.  
  163.         element = self.iterator.prev(*args, **kwargs)
  164.         return element
  165.  
  166.  
  167. class IteratorRepeat(IteratorContain):
  168.  
  169.     def __init__(self, elements=[], next_func=None, prev_func=None):
  170.         super(IteratorRepeat, self).__init__(elements)
  171.         self.next_func = next_func
  172.         self.prev_func = prev_func
  173.         self.element = None
  174.  
  175.     def __iter__(self):
  176.         self.iterator = iter(self.iterator)
  177.         self.element = None
  178.         return self
  179.  
  180.     def next(self, *args, **kwargs):
  181.         self.element = self.iterator.next(*args, **kwargs)
  182.         return self.element
  183.  
  184.     def prev(self, *args, **kwargs):
  185.         self.element = self.iterator.prev(*args, **kwargs)
  186.         return self.element
  187.  
  188.  
  189. # Before retrieving an element. Note that the last element will
  190. # be repeated.
  191. class IteratorPreRepeat(IteratorRepeat):
  192.  
  193.     def next(self, *args, **kwargs):
  194.         if self.element and self.next_func is not None:
  195.             self.next_func(self.element, *args, **kwargs)
  196.         return super(IteratorPreRepeat, self).next(*args, **kwargs)
  197.  
  198.     def prev(self, *args, **kwargs):
  199.         if self.element and self.prev_func is not None:
  200.             self.prev_func(self.element, *args, **kwargs)
  201.         return super(IteratorPreRepeat, self).prev(*args, **kwargs)
  202.  
  203.  
  204. # After retrieving an element
  205. class IteratorPostRepeat(IteratorRepeat):
  206.  
  207.     def next(self, *args, **kwargs):
  208.         element = super(IteratorPostRepeat, self).next(*args, **kwargs)
  209.         if self.next_func is not None:
  210.             self.next_func(element, *args, **kwargs)
  211.         return element
  212.  
  213.     def prev(self, *args, **kwargs):
  214.         element = super(IteratorPostRepeat, self).prev(*args, **kwargs)
  215.         if self.prev_func is not None:
  216.             self.prev_func(element, *args, **kwargs)
  217.         return element
  218.